package sys

/*******************************************************************************
Copyright:cloud
Author:cloudapex@126.com
Version:1.0
Date:2020-06-12
Description: 组织相关接口
*******************************************************************************/
import (
	"context"
	"service/model/mod"
	model "service/model/permis"

	gpc "gitee.com/cloudapex/protos/comm/pb"
	gpb "gitee.com/cloudapex/protos/permis/pb"

	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 组织列表
 * 路由: /group/list
 * 方法: GET
 *********************************************************************/
type GroupList struct {
	Name  string `form:"name" json:"name" binding:"omitempty,max=64"` // 组名
	State int32  `form:"state" json:"state" binding:"omitempty"`      // 状态(1:正常;2:失效)
}

func (this *GroupList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	rsp, err := model.Sysm.GroupList(ctx, &gpb.GroupListReq{CoId: user.CId, Name: this.Name, State: this.State})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 组织树表
 * 路由: /group/tree
 * 方法: GET
 *********************************************************************/
type GroupTree struct{}

func (this *GroupTree) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	rsp, err := model.Sysm.GroupTree(ctx, &gpc.IdRequest{Id: user.CId})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 新增组织
 * 路由: /group/add
 * 方法: POST
 *********************************************************************/
type GroupAdd struct {
	ParentId int64  `form:"parentId" json:"parentId" binding:"omitempty"` // 父Id
	Icon     string `form:"icon" json:"icon" binding:"omitempty"`         // 图标
	Name     string `form:"name" json:"name" binding:"required,max=64"`   // 组名
	Order    int    `form:"order" json:"order" binding:"omitempty"`       // 排序值
	State    int    `form:"state" json:"state" binding:"required"`        // 状态(1:正常;2:失效)
}

func (this *GroupAdd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.GroupAddReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.GroupAdd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 编辑组织
 * 路由: /group/upd
 * 方法: POST
 *********************************************************************/
type GroupUpd struct {
	Id    int64  `form:"id" json:"id" binding:"required"`            // 组Id
	Icon  string `form:"icon" json:"icon" binding:"omitempty"`       // 图标
	Name  string `form:"name" json:"name" binding:"required,max=64"` // 组名
	Order int    `form:"order" json:"order" binding:"omitempty"`     // 排序值
	State int    `form:"state" json:"state" binding:"required"`      // 状态(1:正常;2:失效)
}

func (this *GroupUpd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	req := gpb.GroupUpdReq{}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.GroupUpd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 删除组织
 * 路由: /group/del
 * 方法: POST
 *********************************************************************/
type GroupDel struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 用户组Id
}

func (this *GroupDel) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	rsp, err := model.Sysm.GroupDel(ctx, &gpc.IdRequest{Id: this.Id})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 获取组织角色Ids
 * 路由: /group/choice
 * 方法: GET
 *********************************************************************/
type GroupChoice struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 用户组Id
}

func (this *GroupChoice) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	rsp, err := model.Sysm.GroupChoice(ctx, &gpc.IdRequest{Id: this.Id})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 修改组织角色Ids
 * 路由: /group/choose
 * 方法: POST
 *********************************************************************/
const ( // 错误码
	EGChoose_MisType htp.ECode = iota + 1 // 只有叶子节点组可以绑定角色
)

type GroupChoose struct {
	GId  int64   `form:"gId" json:"gId" binding:"required"`    // 角色Id
	RIds []int64 `form:"rIds" json:"rIds" binding:"omitempty"` // 权限Ids
}

func (this *GroupChoose) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	this.RIds = util.RemoveDuplicate64(this.RIds)

	req := gpb.GroupChooseReq{}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.GroupChoose(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}
